﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Web.UI.WebControls;

namespace DocTes.Jerarquias
{
    /// <summary>
    /// Interfaz del contexto de datos de Linq.
    /// </summary>
    public interface IEntidadLinqDataContext
    {

        /// <summary>
        /// Sube el orden del estado del proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstado">Identificador del estado</param>
        void SubirOrdenEstadoProyecto(Guid idProyecto, Guid idEstado);
        

        /// <summary>
        /// Baja el orden del estado del proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstado">Identificador del estado</param>
        void BajarOrdenEstadoProyecto(Guid idProyecto, Guid idEstado);
        
        /// <summary>
        /// Asocia o desasocia posibles estados a todos los documentos de un proyecto 
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        /// <param name="asociar">Indica si se debe asociar o desasociar los estados</param>
        void AsociarEstadosDocumentosProyecto(Guid idProyecto, Guid idDocumento, Guid idEstadoAprobado, Guid idEstadoRechazado, bool asociar);


        /// <summary>
        /// Retorna el Id del candidato por un id de estacion
        /// </summary>
        /// <param name="idEstacion">Id de la estación</param>
        /// <returns>Id del candidato</returns>
        string GetIdCandidatoByIdEstacion(string idEstacion);

		  /// <summary>
		  /// Retorna el Id del estado con el nombre especificado
		  /// </summary>
		  /// <param name="nombreEstado">Nombre del estado</param>
		  /// <returns>Id del candidato</returns>
		  Guid? GetIdEstadoByNombre(string nombreEstado);


        /// <summary>
        /// Obtiene una lista de sitios por el id del proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <returns></returns>
        ListItemCollection GetSitiosByIdProyecto(string idProyecto);

        /// <summary>
        /// Obtiene una lista de candidatos por el id del sitio y el id del proyecto
        /// </summary>
        /// <param name="idSitio">Identificador del sitio</param>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <returns>Candidatos encontrados</returns>
        ListItemCollection GetCandidatosByIdSitioIdProyecto(string idSitio, string idProyecto);

        /// <summary>
        /// Inserta en el contexto de datos un Documento
        /// </summary>
        /// <param name="documento">asdf</param>
        void InsertarDocumento(IEntidadLinqDocumento documento);

        /// <summary>
        /// Inserta en el contexto de datos una asociacion de documento candidato
        /// </summary>
        /// <param name="asociacion"></param>
        void InsertarAsociacionDocumentoCandidato(AsociacionCandidatoDocumento asociacion);

        /// <summary>
        /// Sube de orden los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void SubirOrdenEstadoDocumentoProyecto(Guid idProyecto, Guid idEstadoAprobado, Guid idEstadoRechazado);

        /// <summary>
        /// Baja de orden los estados de los documentos de un proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void BajarOrdenEstadoDocumentoProyecto( Guid idProyecto, Guid idEstadoAprobado, Guid idEstadoRechazado);

        /// <summary>
        /// Borra un estado de un proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstado">id del estado</param>
        void BorrarEstadoProyecto(string idProyecto, string idEstado);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="idEstadoAprobado"></param>
        /// <param name="idEstadoRechazado"></param>
        void BorrarEstadoDocumentosProyecto(string idProyecto, string idEstadoAprobado, string idEstadoRechazado);

        /// <summary>
        /// Enserta un nuevo estado en la base de datos asociandolo a un proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="nombreEstado">nombre del estado a insertar</param>
        void InsertarEstadoProyecto(Guid idProyecto, string nombreEstado);

        /// <summary>
        /// Inserta estados de documentos a un proyecto en especifico
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <param name="nombreEstadoAprobado">Nombre del estado de aprobado</param>
        /// <param name="nombreEstadoRechazado">Nombre del estado de rechazado</param>
        void InsertarEstadoDocumentosProyecto(Guid idProyecto, string nombreEstadoAprobado, string nombreEstadoRechazado);


		 /// <summary>
		 /// Metodo que asocia los estados predeterminados de ninguno y creado a un proyecto
		 /// </summary>
		 /// <param name="idProyecto"></param>
		  void InicializarAsociacionesEstadosPredeterminados(Guid idProyecto);
		 
        /// <summary>
        /// Inserta una nueva carpeta como subcarpeta de la carpeta padre cuyo guid es dado. Si el padre
        /// no existe nada es insertado
        /// </summary>
        /// <param name="idCarpetaPadre">id carpeta padre</param>
        /// <param name="nombreCarpetaNueva">nombre de nueva carpeta</param>
        void InsertarCarpeta(Guid idCarpetaPadre, string nombreCarpetaNueva);

        /// <summary>
        /// Retorna el id de un estado seleccionado de un proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <returns>Retorna el id del estado seleccionado como string en caso de no haber estado seleccionado retorna "- - -"</returns>
        string GetEstadoSeleccionadoProyecto(Guid idProyecto);


        /// <summary>
        /// Retorna un candidato a partir de una sentencia where
        /// </summary>
        ReadOnlyCollection<IEntidadLinqCandidato> Candidatos { get; }

        /// <summary>
        /// Retorna un listado de documentos
        /// </summary>
        ReadOnlyCollection<IEntidadLinqDocumento> Documentos { get; }

        /// <summary>
        /// Retorna un listado de jerarquiasCarpeta
        /// </summary>
        ReadOnlyCollection<IEntidadLinqJerarquiaCarpeta> JerarquiasCarpeta { get; }

        /// <summary>
        /// Borra una carpeta
        /// </summary>
        /// <param name="idJerarquiaCarpeta">id de carpeta a borrar</param>
        void BorrarJerarquiaCarpeta(Guid idJerarquiaCarpeta);

        /// <summary>
        /// Borra un documento
        /// </summary>
        /// <param name="idDocumento">id del documento a borrar</param>
        void BorrarDocumento(Guid idDocumento);

		 /// <summary>
		 /// Borra un documento con un tag específico en una carpeta especifica. Si la 
		 /// carpeta llegara a tener más de un documento con el mismo tag se borrarán todos
		 /// </summary>
		  /// <param name="idProyecto">id del Proyecto</param>
		 /// <param name="idJerarquiaCarpeta">id de la carpeta</param>
		 /// <param name="idDocumentoTag">id del tag del documento a borrar</param>
		  void BorrarDocumentos(Guid idProyecto, Guid idJerarquiaCarpeta, int idDocumentoTag);
		 

        /// <summary>
        /// Retorna un listado de documentos con el idProyecto 
        /// </summary>
        /// <param name="idProyecto">id del proyecto asociado a los documentos</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentosByIdProyecto(Guid idProyecto);

        /// <summary>
        /// Retorna una lista de jerarquias carpetas
        /// </summary>
        /// <param name="nombreCarpetaBase">nombre de la carpeta base</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqJerarquiaCarpeta> GetJerarquisHijasByJerarquiBaseName(string nombreCarpetaBase);

        /// <summary>
        /// Retorna una lista de jerarquias carpetas
        /// </summary>
        /// <param name="idCarpetaBase">id de la carpeta base</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqJerarquiaCarpeta> GetJerarquisHijasByJerarquiBaseName(Guid idCarpetaBase);

        /// <summary>
        /// Obtiene una jerarquia de carpeta por id
        /// </summary>
        /// <param name="idJerarquia">id de la jerarquia carpeta a buscar</param>
        /// <returns>Retorna la entidad encontrada</returns>
        IEntidadLinqJerarquiaCarpeta GetJerarquiaById(Guid idJerarquia);

        /// <summary>
        /// Retorna una lista de documentos por la jerarquia de carpeta 
        /// </summary>
        /// <param name="idJerarquia">Id de la carpeta</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentosByJerarquiaId(Guid idJerarquia);

        /// <summary>
        /// Obtiene una lista de documentos asociados a un candidato y en una agrupacion especifica
        /// </summary>
        /// <param name="idCandidato">Id del candidato</param>
        /// <param name="carpeta">Carpeta de agrupacion</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentosByCandidatoCategoria(Guid idCandidato, string carpeta);

		  /// <summary>
		  /// Obtiene una lista de documentos asociados a un candidato
		  /// </summary>
		  /// <param name="idCandidato">Id del candidato</param>
		  /// <returns></returns>
		  ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentosByCandidato(Guid idCandidato);

        /// <summary>
        /// Busca un documento por id
        /// </summary>
        /// <param name="idDocumento">id del documento a buscar</param>
        /// <returns>Retorna el documento encontrado o null si el documento no existe</returns>
        IEntidadLinqDocumento GetDocumentoById(Guid idDocumento);

        /// <summary>
        /// Busca un proyecto por nombre y por nombre de cliente
        /// </summary>
        /// <param name="nombreProyecto">nombre del proyecto a buscar</param>
        /// <param name="nombreCliente">nombre del cliente a buscar</param>
        /// <returns>Retorna el proyecto encontrado o null si el proyecto no existe</returns>
        IEntidadLinqProyecto GetProyectoPorNombreConCliente(string nombreProyecto, string nombreCliente);

        /// <summary>
        /// Busca un proyecto por id
        /// </summary>
        /// <param name="idProyecto">id del proyecto a buscar</param>
        /// <returns>Retorna el proyecto encontrado o null si el proyecto no existe</returns>
        IEntidadLinqProyecto GetProyectoPorID(Guid idProyecto);


        ///// <summary>
        ///// Busca un proyecto por id
        ///// </summary>
        ///// <param name="idProyecto">nombre del proyecto a buscar</param>
        ///// <returns>Retorna el proyecto encontrado o null si el proyecto no existe</returns>
        //IEntidadLinqProyecto GetProyectoPorId(Guid idProyecto);

        /// <summary>
        /// Retorna una lista de estados segun el proyecto
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <returns>Lista de estados del proyecto</returns>
        ReadOnlyCollection<IEntidadLinqAsociacionProyectosEstadoProyecto> GetAsociacionesEstadoProyectosByIdProyecto(string idProyecto);

        /// <summary>
        /// Retorna los estados de los documento segun el proyecto
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <returns></returns>
        ReadOnlyCollection<IEntidadLinqAsociacionProyectosEstadoDocumentos> GetAsociacionesEstadoDocumentosProyectosByIdProyecto(string idProyecto);

        /// <summary>
        /// Retorna si hay algun otro estado despues de este en orden
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstado">id del estado</param>
        /// <returns>True si no es el ultimo consecutivo, false si si lo es</returns>
        bool UltimoEstadoProyecto(string idProyecto, string idEstado);

        /// <summary>
        /// Retorna si hay algun otro estado despues de este en orden
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="idEstadoAprobado">id del estado de aprobado</param>
        /// <returns>True si no es el ultimo consecutivo, false si si lo es</returns>
        bool UltimoEstadoDocumentoProyecto(string idProyecto, string idEstadoAprobado);


        /// <summary>
        /// Obtiene un sitio por id
        /// </summary>
        /// <param name="idSitio">id del sitio a buscar</param>
        /// <returns>retorna el sitio encontrado o null si no existe</returns>
        IEntidadLinqSitio GetSitioById(Guid idSitio);

        /// <summary>
        /// Retorna todos los documentos ordenados para generar un reporte
        /// </summary>
        /// <param name="idProyecto">Identificador del proyecto</param>
        /// <returns>Documentos ordenados para el reporte</returns>
        ReadOnlyCollection<IEntidadLinqDocumento> GetDocumentosReporte(Guid idProyecto);

        /// <summary>
        /// Guarda en Base de datos
        /// </summary>
        void SubmitChanges();

        /// <summary>
        /// Dispose
        /// </summary>
        void Dispose();

        /// <summary>
        /// Obtiene una jerarquia de carpeta
        /// </summary>
        /// <param name="nombreCarpetaBase">Nombre de la carpeta</param>
        /// <param name="idCandidato">Id del candidato</param>
        /// <returns>Retorna la entidad jerarquia de carpeta</returns>
        IEntidadLinqJerarquiaCarpeta GetJerarquiByIdCandidatoNombreCarpeta(string nombreCarpetaBase, Guid idCandidato);


        /// <summary>
        /// Obtiene el id de una carpeta por el nombre de la carpeta
        /// </summary>
        /// <param name="nombreCarpetaBase">nombre de la carpeta</param>
        /// <returns>id de la carpeta</returns>
        Guid GetIdJerarquiaByNombre(string nombreCarpetaBase);

        /// <summary>
        /// Crea una jerarquia carpeta con un nombre especifico
        /// </summary>
        /// <param name="nombreCarpetaBase">nombre de la carpeta</param>
        /// <returns>Id de la carpeta creada</returns>
        Guid CrearJerarquiaCarpeta(string nombreCarpetaBase);

        /// <summary>
        /// Inserta el documento del reporte
        /// </summary>
        /// <param name="idProyecto">id del proyecto</param>
        /// <param name="nombreArchivo">nombre del archivo</param>
        /// <param name="archivo">archivo</param>
        /// <param name="idJerarquia">id carpeta</param>
        void InsertarDocumentoReporte(Guid idProyecto, string nombreArchivo, System.Data.Linq.Binary archivo, Guid idJerarquia);

        /// <summary>
        /// Asocia un posible estado a un documento
        /// </summary>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void AsociarEstadoPosibleDocumento(Guid idDocumento, Guid idEstadoAprobado, Guid idEstadoRechazado);


		  /// <summary>
		  /// Metodo para cambiar la columna relevante en los documentos que esten en la carpeta indicada
		  /// con el tag indicado
		  /// </summary>
		  /// <param name="idProyecto">id del proyecto</param>
		  /// <param name="idJerarquiaCarpeta">id de la carpeta que contiene el archivo</param>
		  /// <param name="idDocumentoTag">id del tipo de documento a cambiar</param>
		  void SwitchRelevancia(Guid idProyecto, Guid idJerarquiaCarpeta, int idDocumentoTag);
        /// <summary>
        /// Desasocia un posible estado a un documento
        /// </summary>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        void DesasociarEstadoPosibleDocumento(Guid idDocumento, Guid idEstadoAprobado, Guid idEstadoRechazado);

        /// <summary>
        /// Indica si existen los estados para ese documento
        /// </summary>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idEstadoAprobado">Identificador del estado aprobado</param>
        /// <param name="idEstadoRechazado">Identificador del estado rechazado</param>
        /// <returns></returns>
        bool ExistenAsociaciones(Guid idDocumento, Guid idEstadoAprobado, Guid idEstadoRechazado);

        /// <summary>
        /// Indica si es el estado creado
        /// </summary>
        /// <param name="idEstado">Identificador del estado</param>
        /// <returns></returns>
        bool EsEstadoCreado(string idEstado);

        /// <summary>
        /// Cambia un documento al estado creado
        /// </summary>
        /// <param name="idDocumento">identificador del documento</param>
        void CambiarDocumentoEstadoCreado(string idDocumento);

        /// <summary>
        /// Cambia el estado del documento al estado indicado
        /// </summary>
        /// <param name="idDocumento">Identificador del documento</param>
        /// <param name="idNuevoEstado">Identificador del estado</param>
        void CambiarEstadoDocumento(string idDocumento, string idNuevoEstado);
    }
}
